/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Logica;

import BD.Conector;
import Clases.Licencia;
import Clases.Titular;
import static Logica.Logica_titular.obtenerEdad;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import javax.swing.JOptionPane;
import BD.ABM_Licencia;

/**
 *
 * @author Ramiro
 */
public class Logica_Licencia {
    
    public static boolean emitirLicencia(Titular titularObtenido, Licencia licenciaAEmitir){
        
        boolean licenciaValida=false;
        boolean licenciaGenerada;
        String tipoLicencia=licenciaAEmitir.getTipoLicencia();
        boolean licenciaProfesional=(tipoLicencia.equals("C") || tipoLicencia.equals("D") || tipoLicencia.equals("E"));
        
        if(validarEdad(titularObtenido, licenciaAEmitir)){
            if(licenciaProfesional){
                if(aptoLicenciaProfesional(titularObtenido))
                    licenciaValida=true;
            }
            else
                licenciaValida=true;
        }

        if(licenciaValida){
            
            BD.ABM_Licencia.crear_licencia(licenciaAEmitir);
            licenciaGenerada=true;
        }
        else{
            JOptionPane.showMessageDialog(null, "El titular no cumple con los requisitos para la licencia seleccionada.");
            licenciaGenerada=false;
        }
        
        return licenciaGenerada;
    }
    
    public static boolean validarEdad(Titular titularObtenido, Licencia licenciaAEmitir){
        
        int edadTitular=obtenerEdad(titularObtenido);
        String tipoLicencia=licenciaAEmitir.getTipoLicencia();
        
        //Verificamos si l alicencia es común o profesional
        boolean licenciaComun=(tipoLicencia.equals("A") || tipoLicencia.equals("B") || tipoLicencia.equals("F") || tipoLicencia.equals("G"));
        boolean licenciaProfesional=(tipoLicencia.equals("C") || tipoLicencia.equals("D") || tipoLicencia.equals("E"));
        
        if(licenciaComun){
            if(edadTitular<17){
                return false;
            }
        }
        else if(licenciaProfesional){
            if(edadTitular<21){
                return false;
            }
        }
        
        return true;
    }
    
    public static Date generarCaducidad(Titular titularObtenido, Licencia licenciaAEmitir){
        
        int edadTitular=obtenerEdad(titularObtenido);
        int tramitoLicenciaComun=titularObtenido.getTramitoLicComun();
        int tramitoLicenciaProfesional=titularObtenido.getTramitoLicProfesional();
        Date fechaNacimientoTitular=titularObtenido.getFechaNacimiento();
        String tipoLicencia=licenciaAEmitir.getTipoLicencia();
        
        int fechaNacimientoYear=fechaNacimientoTitular.getYear();
        int fechaNacimientoMonth=fechaNacimientoTitular.getMonth();
        int fechaNacimientoDay=fechaNacimientoTitular.getDate();
        
        Date fechaHoy=new Date();
        
        int fechaHoyYear=fechaHoy.getYear();
        
        Date fechaCaducidad=new Date();
        
        int tiempoCaducidad;
        
         if(edadTitular<21){
            if(tramitoLicenciaComun==0){
                fechaCaducidad=new Date(fechaHoyYear+1, fechaNacimientoMonth, fechaNacimientoDay);
            }
            else
                    fechaCaducidad=new Date(fechaHoyYear+3, fechaNacimientoMonth, fechaNacimientoDay);
            }
        if(edadTitular>=21 && edadTitular<=46)
            fechaCaducidad=new Date(fechaHoyYear+5, fechaNacimientoMonth, fechaNacimientoDay);
        if(edadTitular>46 && edadTitular<=60)
            fechaCaducidad=new Date(fechaHoyYear+4, fechaNacimientoMonth, fechaNacimientoDay);
        if(edadTitular>60 && edadTitular<=70)
            fechaCaducidad=new Date(fechaHoyYear+3, fechaNacimientoMonth, fechaNacimientoDay);
        if(edadTitular>70)
            fechaCaducidad=new Date(fechaHoyYear+1, fechaNacimientoMonth, fechaNacimientoDay);
        
        return fechaCaducidad;
    }
    
    // Para determinar si es apto, debe poseer una licencia B otorgada el año anterior.
    // Además, si posee más de 65 años, debe haberle sido otorgada en algún momento anterior
    // una licencia profesional.
    
    public static boolean aptoLicenciaProfesional(Titular titularObtenido){
    
        int edadTitular=obtenerEdad(titularObtenido);
        boolean esApto=false;
        
        if(poseeLicenciaB(titularObtenido)){
            if(fueConductorProfesional(titularObtenido)){
                esApto=true;
            }
            else if(edadTitular<=65){
                esApto=true;
            }
        }
        
        return esApto;
    }
    
    public static boolean fueConductorProfesional(Titular titularObtenido){
    
        String sql;
        ResultSet rs_licencia;
        Connection miConexion;
        Integer documentoTitular=titularObtenido.getNumeroDoc();
        boolean fueConductorProfesional=false;
        
        miConexion=Conector.GetConnection();
        
        try{

                sql="SELECT idLicencia, idTitular, tipo, fechaEmision FROM licencia WHERE tipo IN ('C', 'D', 'E') AND idTitular=" + documentoTitular.toString();
                PreparedStatement estatuto_licencia=Conector.GetConnection().prepareStatement(sql);

                rs_licencia=estatuto_licencia.executeQuery();
                    
                if(rs_licencia.next()){
                    fueConductorProfesional=true;
                }
                    
                estatuto_licencia.close();
        }
        catch (SQLException e) {
            System.out.println(e.getMessage());
            JOptionPane.showMessageDialog(null, "Excepción al consultar la base de datos.");
        }
        
        return fueConductorProfesional;
    }
    
    public static boolean poseeLicenciaB(Titular titularObtenido){
        
        Connection miConexion;
        boolean poseeLicenciaB=true;
        String sql;
        ResultSet rs_licencia;
        Integer documentoTitular=titularObtenido.getNumeroDoc();
        boolean existeLicencia=false;
        
        Date fechaEmisionLicenciaB=new Date();
        int fechaEmisionLicenciaBYear;
        int fechaEmisionLicenciaBMonth;
        int fechaEmisionLicenciaBDay;
        
        miConexion=Conector.GetConnection();

        try{
                sql="SELECT idLicencia, idTitular, tipo, fechaEmision FROM licencia WHERE activa=1 AND tipo='B' AND idTitular=" + documentoTitular.toString();
                PreparedStatement estatuto_licencia=Conector.GetConnection().prepareStatement(sql);

                rs_licencia=estatuto_licencia.executeQuery();
                    
                if(rs_licencia.next()){
                    fechaEmisionLicenciaB=rs_licencia.getDate("fechaEmision");
                    existeLicencia=true;
                }
                    
                estatuto_licencia.close();
        }
        catch (SQLException e) {
            System.out.println(e.getMessage());
            JOptionPane.showMessageDialog(null, "Excepción al consultar la base de datos.");
        }
            
        if(existeLicencia){ //Determinar si su emisión es hace un año o más.
            
            Date fechaHoy=new Date();
            int fechaHoyYear=fechaHoy.getYear();
            int fechaHoyMonth=fechaHoy.getMonth();
            int fechaHoyDay=fechaHoy.getDay();
            
            fechaEmisionLicenciaBYear=fechaEmisionLicenciaB.getYear();
            fechaEmisionLicenciaBMonth=fechaEmisionLicenciaB.getMonth();
            fechaEmisionLicenciaBDay=fechaEmisionLicenciaB.getDay();
            
            int difYear=fechaHoyYear-fechaEmisionLicenciaBYear;
            int difMonth=fechaHoyMonth-fechaEmisionLicenciaBMonth;
            int difDay=fechaHoyDay-fechaEmisionLicenciaBDay;
            
            if(difYear==0){
                poseeLicenciaB=true;
            }
            else if(difYear==1){
                if(difMonth<0)
                    poseeLicenciaB=true;
                else if(difMonth>0)
                    poseeLicenciaB=false;
                else if(difMonth==0){
                    if(difDay<=0){
                        poseeLicenciaB=true;
                    }
                    else{ //difDay==0
                        poseeLicenciaB=false;
                    }
                }
            }
            else{
                poseeLicenciaB=false;
            }
        }
        else
            poseeLicenciaB=false;
        
        return poseeLicenciaB;
    }
    
}
